<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>30混入可复用</title>
</head>
<body>
<div id="app">
    <input type="text" v-model="count">{{ count }}<br>
    <input type="text" v-model="userName">{{ userName }}<br>
    <button v-on:click="getInfo()">点击</button>
</div>
<script src="../vue.global.3.0.5.js"></script>
<script>
    const outerAssembly = {
        data() {
            return {
                
            }
        },
        template: `
        <input type="text" value="Mr.GuoZi" ref="userZi" />
        `
    }

    //1、创建一个可复用的混入
    const baseMixIn = {
        data() {
            return { 
                count: 20,
                userName: "Mr.Guo"
            }
        },
        methods: {
            getInfo: function() {
                console.log("混入的方法getInfo()");
            }
        },
        created() {
            this.count=32;
            console.log("混入的created()");
        }
    };

    //1、创建一个Vue应用实例，本身是最顶层的根组件
    const app = Vue.createApp({
        data() {
            return { 
                //【混入冲突1】混入的内容重复时以组件体内设置的内容为主
                count: 10
            }
        },
        //加载可混入的内容
        mixins: [baseMixIn],
        //【混入冲突2】混入的内容包含同名钩子时，先执行混入的钩子再执行组件内的钩子
        created() {
            this.count=31;
            console.log("组件内created()");
        },
        methods: {
            //【混入冲突3】混入的内容包含同名方法时，仅执行组件内的方法
            getInfo: function() {
                console.log("组件内的方法getInfo()");
            }
        },
        computed: {
            
        },
        watch: {

        },
        components: {
            //命名规则必须是小写字母加-
            "outer-assembly": outerAssembly
        }
    });
    //2、定义一个全局组件
    app.component('button-counter', {
        //数据
        data() {
            return {
                counter: 100
            }
        },
        //模板
        template: `
            计算器: {{counter}}
            <button v-on:click="counter++">counter++</button><br>
        `
    });
    //3、挂载，返回值是代理对象并不是应用实例本身
    const vm = app.mount("#app");
</script>
</body>
</html>